package com.zbkj.dal.common.utils;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 金额转换
 */
public class MoneyUtil {

    private static final ThreadLocal<DecimalFormat> DEFAULT_FORMAT = createThreadLocalNumberFormat("0.00");
    private static final ThreadLocal<DecimalFormat> PRETTY_FORMAT = createThreadLocalNumberFormat("#,##0.00");
    private static final BigDecimal PRECISION = new BigDecimal(1000000);
    private static final BigDecimal FEN_PRECISION = new BigDecimal(100);
    private static final int SIX_SCALE = 6;
    private static final int TWO_SCALE = 2;

    /**
     * ThreadLocal重用MessageDigest
     *
     * @param pattern
     * @return
     */
    private static ThreadLocal<DecimalFormat> createThreadLocalNumberFormat(final String pattern) {
        return ThreadLocal.withInitial(() -> {
            DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();
            df.applyPattern(pattern);
            return df;

        });
    }

    ////////////////////////////////////格式化金额/////////////////////////////////////////

    /**
     * 格式化金额，默认格式：#,##0.00 ,例如：33999999932.3333d 输出：33,999,999,932.33
     */
    public static String prettyFormat(BigDecimal number) {
        if (ObjectUtil.isNull(number)) {
            return "0.00";
        }
        return prettyFormat(number.doubleValue());
    }

    public static String prettyFormat(String number) {
        if (StringUtils.isBlank(number)) {
            return "0.00";
        }
        return prettyFormat(new BigDecimal(number));
    }

    public static String prettyFormat(Long number) {
        return prettyFormat(long2yuanTwoScale(number));
    }

    public static String prettyFormat(long number) {
        return prettyFormat(long2yuanTwoScale(number));
    }

    /**
     * 格式化金额，默认格式：#,##0.00 ,例如：33999999932.3333d 输出：33,999,999,932.33
     */
    public static String prettyFormat(double number) {
        return PRETTY_FORMAT.get().format(number);
    }


    ////////////////////////////////////金额保留六位/////////////////////////////////////////

    /**
     * 金额转整数
     *
     * @param money
     * @return
     */
    public static Long parseBigDecimalToLong(BigDecimal money) {
        return parseBigDecimalToLong(money, PRECISION);
    }

    /**
     * 金额转整数
     *
     * @param moneyStr
     * @return
     */
    public static Long parseStrToLong(String moneyStr) {
        BigDecimal money = BigDecimal.ZERO;
        if (StrUtil.isNotBlank(moneyStr)) {
            money = new BigDecimal(moneyStr);
        }
        return parseBigDecimalToLong(money, PRECISION);
    }

    /**
     * 金额转整数
     *
     * @param money
     * @return
     */
    public static Long parseBigDecimalToLong(Number money) {
        return parseBigDecimalToLong(new BigDecimal(money.toString()), PRECISION);
    }

    /**
     * @param money
     * @return
     */
    public static Long parseBigDecimalToLong(BigDecimal money, BigDecimal precision) {
        if (money == null) {
            return 0L;
        }
        return money.multiply(precision).longValue();
    }

    public static Integer parseBigDecimalToInt(BigDecimal money, BigDecimal precision) {
        if (money == null) {
            return 0;
        }
        return money.multiply(precision).intValue();
    }

    /**
     * 人民币金额单位转换，整型转换成元，取6位小数 例如：1500000 => 1.5
     */
    public static BigDecimal long2yuanSixScale(Long num) {
        if (ObjectUtil.isNull(num)) {
            return BigDecimal.ZERO;
        }
        return long2yuanSixScale(new BigDecimal(num));
    }

    /**
     * 人民币金额单位转换，整型转换成元，取6位小数 例如：1500000 => 1.5
     */
    public static BigDecimal long2yuanSixScale(BigDecimal num) {
        return num.divide(PRECISION, SIX_SCALE, RoundingMode.HALF_UP);
    }

    /**
     * 人民币金额单位转换，整型转换成元，取2位小数 例如：1500000 => 1.50
     */
    public static BigDecimal long2yuanTwoScale(Long num) {
        if (ObjectUtil.isNull(num)) {
            return BigDecimal.ZERO;
        }
        return long2yuanTwoScale(BigDecimal.valueOf(num));
    }

    /**
     * 人民币金额单位转换，整型转换成元，取2位小数 例如：1500000 => 1.50
     */
    private static BigDecimal long2yuanTwoScale(BigDecimal num) {
        return num.divide(PRECISION, TWO_SCALE, RoundingMode.HALF_UP);
    }

    public static Integer yuan2Fen(BigDecimal num) {
        return parseBigDecimalToInt(num, FEN_PRECISION);
    }

    public static BigDecimal yuanTwoScale(BigDecimal num) {
        return num.setScale(2, RoundingMode.DOWN);
    }

}
